#ifndef __WED_UART_H__
#define __WED_UART_H__

#include "../Wed_dev.h"
#include "mem/Wed_mem.h"

#define WED_UART_TX_POLL_FLAG     (0)
#define WED_UART_TX_INT_FLAG      (1)
#define WED_UART_TX_FLAG_MASK     (1)
#define WED_UART_RX_POLL_FLAG     (0 << 1)
#define WED_UART_RX_INT_FLAG      (1 << 1)

/* \brief UART 设备操作函数集 */
struct Wed_uart_opts {
    int (*p_fn_init)(void *p_opts_arg);
    int (*p_fn_byte_write)(void *p_opts_arg, uint8_t data);
    int (*p_fn_byte_read)(void *p_opts_arg, uint8_t *p_data);
};

/* \brief UART 设备结构体 */
struct Wed_uart {
    struct Wed_dev        dev;         /* 基础设备 */
    struct Wed_uart_opts *p_opts;      /* UART 操作函数集 */
    void                 *p_opts_arg;  /* UART 操作函数参数 */
    //struct Wed_mutex    lock;                       /* 互斥锁 */
    struct Wed_mutex      tx_lock;     /* 发送互斥锁 */
    struct Wed_mutex      rx_lock;     /* 接收互斥锁 */
    struct Wed_list_node  node;        /* UART 设备节点 */
    uint32_t              flag;
};

/**
 * \brief UART 设备链表初始化
 *
 * @return 成功返回 0
 */
int Wed_uart_list_init(void);
/**
 * \brief UART 设备注册函数
 *
 * @param p_uart_name UART 名字
 * @param p_opts      UART 设备操作函数集
 * @param p_opts_arg  操作函数参数
 * @param flag        标志
 *
 * @return 成功返回 0
 */
int Wed_uart_register(char                 *p_uart_name,
                      struct Wed_uart_opts *p_opts,
                      void                 *p_opts_arg,
                      uint32_t              flag);
/**
 * \brief UART 设备写函数
 *
 * @param p_uart_dev UART 设备结构体
 * @param p_data     要写的数据缓存
 * @param data_len   要写的数据长度
 *
 * @return 返回实际写的数据长度
 */
int Wed_uart_write(struct Wed_uart *p_uart_dev,
                   uint8_t         *p_data,
                   uint32_t         data_len);
#endif
